﻿#region The MIT License - Copyright (C) 2012-2013 Pieter Geerkens
/////////////////////////////////////////////////////////////////////////////////////////
//                PG Software Solutions Inc. - Hex-Grid Utilities
/////////////////////////////////////////////////////////////////////////////////////////
// The MIT License:
// ----------------
// 
// Copyright (c) 2012-2013 Pieter Geerkens (email: pgeerkens@hotmail.com)
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, 
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 
// permit persons to whom the Software is furnished to do so, subject to the following 
// conditions:
//     The above copyright notice and this permission notice shall be 
//     included in all copies or substantial portions of the Software.
// 
//     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
//     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
//     NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
//     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
//     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
//     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
//     OTHER DEALINGS IN THE SOFTWARE.
/////////////////////////////////////////////////////////////////////////////////////////
#endregion
using System;
using System.Diagnostics;
using System.Collections.Generic;

namespace PG_Napoleonics.Utilities {
  public struct KeyValuePair<TKey,TValue> : IComparable<KeyValuePair<TKey,TValue>>
    where TKey : IComparable<TKey>
  {
    public TKey   Key;
    public TValue Value;

    public KeyValuePair(TKey key, TValue value) {
      Key   = key;
      Value = value;
    }
    int IComparable<KeyValuePair<TKey,TValue>>.CompareTo(KeyValuePair<TKey,TValue> rhs) { 
      return this.Key.CompareTo(rhs.Key); 
    }
  }

  public interface IHeap<T> where T : struct, IComparable<T> {
    /// <summary>Returns the number of elements in the heap.</summary>
    int Count    { get; }
    /// <summary>Return whether the heap is empty.</summary>
    bool IsEmpty { get; }

    /// <summary>Add an element <c>item</c> to the heap.</summary>
    void Add(T item);
    /// <summary>???</summary>
    void BuildHead();
    /// <summary>Delete all elements from the heap.</summary>
    void Clear();
    /// <summary>Return top element, removing it from the heap.</summary>
    T    ExtractFirst();
    /// <summary>Return top element, leaving it on the heap.</summary>
    T    Peek();
  }
}
